package demo03;

import java.util.ArrayList;
import java.util.Iterator;

public class Demo01Generic {
    public static void main(String[] args) {
        demo01();
        demo02();
    }

    /*
     *  创建集合对象，使用泛型
     *  好处：
     *      1. 避免了类型转换的麻烦，存储的是什么类型，取出的就是什么类型
     *      2. 把运行期异常（代码运行之后会抛出的异常）提升到了编译器（写代码时会报错）
     *  弊端：泛型是什么类型，就只能存储什么类型的数据
     */
    private static void demo02() {
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("abc");
        // arrayList.add(1); // 编译报错，集合泛型限定了字符串类型，因此只能添加字符串类型数据

        // 使用迭代器遍历
        Iterator<String> iterator = arrayList.iterator(); // 迭代器需要使用与集合相同的泛型
        while (iterator.hasNext()) {
            String string = iterator.next();
            System.out.println(string + "->" + string.length()); // abc->3，使用泛型后，就可以使用泛型类型对应的方法
        }
    }

    /*
     *  创建集合对象，不使用泛型
     *  好处：集合不使用泛型，默认的类型就是Object类型，可以存储任意类型的数据
     *  弊端：集合不安全，会引发异常
     */
    private static void demo01() {
        ArrayList arraylist = new ArrayList<>();
        arraylist.add("abc");
        arraylist.add(1);

        // 使用迭代器遍历
        Iterator iterator = arraylist.iterator(); // 获取迭代器
        while (iterator.hasNext()) { // 使用迭代器中的方法hasNext和next遍历集合
            Object obj = iterator.next();
            System.out.println(obj); // abc 1

            // 想要使用String类特有的方法length获取字符串的长度，就不能直接使用，由于多态性（父类对象多态创建不可使用子类特有方法）
            // 因此需要向下转型
            // String string = (String) obj; // ClassCastException类转换异常，不能把Integer类型强制转换为String类型
            // System.out.println(string.length());
        }
    }
}
